Chapter 3 Array and Data Structure Allocation and Access
#CSAPP
在不考虑编译器优化以及十分小的情况下,以下三种复合数据基本储存在栈上
数组
- Allocation: 分配一段连续的内存空间
- Access: 数组名可以理解为一个指向这段内存空间之首的指针,通过偏移 数据大小 * 下标 bytes 来访问和修改对应的元素。数组运算主要包括下标,指针加减、取地址、解引用以及他们的组合。
二维数组只要理解为嵌套数据类型即可
(多维)数组有规律地访存时,编译器(-O1)会识别模式并以加法优化掉每次访存的乘法运算
结构体
- 一块连续的按顺序摆放各成员的一定程度对齐过的内存空间
- 结构体实例名会和指向内存空间之首的指针相关,访问成员只需要获取对应的偏移量(由编译器维护,并非汇编器特性)
共用体
- 一块以最大成员的大小为长度的内存空间
- 直接以这块内存空位之首开始解析固定数据长度的内存
对齐
现行的机器即使数据没有对齐也能处理,不过对齐的数据处理速度普遍更快。
对齐的基本规则为:any primitive object of K bytes must have an address that is a multiple of K。
根据硬件要求、软件约定,还有一些额外的对齐要求:
- 如 x86-64 ABI 要求 %rsp 在 call 指令调用前必须为 16 位对齐
对于结构体的内存布局而言
- 需要在内部填充 gap 保证每个数据都满足对其要求
- 需要在尾部填充 gap 保证整个结构体的长度为最大的成员对其要求,这是为了保证结构体数组的内存分配不需要采取额外的对齐措施,只需要首地址对齐即可
分配地址时:结构体的对齐要求是最严格的成员对齐要求,数组的对齐要求就是其成员的对齐要求